home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / paolib / drv.c < prev    next >
Text File  |  1991-10-18  |  5KB  |  169 lines

  1. /* << High C V1.4 >> **********************************************************
  2. **
  3. **    ドライブ( A: ~ P: )の状態を取得するプログラムです。
  4. **
  5. **    < HISTORY >
  6. **    1990.02.07 : CREATE
  7. **    1991.04.23 : 清書
  8. **
  9. **    < note > : TABS = 4
  10. **
  11. **    Programmed by Y.Hirata ( Nifty ID : NAB03321 )
  12. **
  13. ******************************************************************************/
  14.  
  15. #include <dos.h>
  16. #include <stdio.h>
  17. #include <msdos.cf>
  18. #include "hc.h"
  19.  
  20. /***************************  デバイス番号の取得  ****************************/
  21. uchar DRV_devno( uchar drvno, uchar *drive_type, uchar *drive_no )
  22. /*=============================================================================
  23. **    < INPUT  > : drvno [BYTE] - ドライブ番号 ( 0 ~ 15 )
  24. **-----------------------------------------------------------------------------
  25. **    < OUTPUT > : *drive_type [BYTE] - ドライブ種別
  26. **                                    = 00H - 1MBフロッピィディスク
  27. **                                    = 02H - ハードディスク
  28. **                                    = 03H - RAM ディスク
  29. **                                    = 05H - ROM
  30. **                                    = FFH - 未登録
  31. **               : *drive_no   [BYTE] - 物理ドライブ番号
  32. **-----------------------------------------------------------------------------
  33. **    < RETURN > : デバイス番号
  34. **                 = 0 の場合は、エラー
  35. **                  エラーはドライブ番号の誤りまたはドライブ種別が不明の時です。
  36. **
  37. **    デバイス番号
  38. **    _7_6_5_4_3_2_1_0_
  39. **    | | | | | | | | |
  40. **    ~~~~~~~~~~~~~~~~~
  41. **            |-------| : ドライブ番号 ( 0 ~ 15 ), HD の場合は、ユニット番号!
  42. **    |-------| : デバイス
  43. **                FPD = 0010 <02H>
  44. **                HD  = 1011 <0BH>
  45. **                RAM = 0100 <04H> : ドライブ番号は 0
  46. **                ROM = 0100 <04H> : ドライブ番号は 2
  47. =============================================================================*/
  48. {
  49.     int        adrs ;
  50.     uchar    devno ;
  51.  
  52.     static uchar    getsysflg = FALSE ;
  53.     static uchar    sysinf[200] ;
  54.  
  55.     devno = 0 ;
  56.     if ( drvno > 15 )
  57.         return( FALSE ) ;
  58.  
  59.     if ( !getsysflg ) {
  60.         SYS_getinf( sysinf ) ;
  61.         getsysflg = TRUE ;
  62.     }
  63.  
  64.     adrs = drvno * 2 + 48 ;
  65.     *drive_type = sysinf[adrs] ;
  66.     *drive_no = sysinf[adrs+1] ;
  67.     if ( *drive_type == DRV_FD ) {                        /*  FD    */
  68.         devno = DEV_FD | *drive_no ;
  69.     } else if ( *drive_type == DRV_HD ) {                /*  HD  */
  70.         devno = DEV_HD | (*drive_no >> 4) ;
  71.     } else if ( *drive_type == DRV_RAM ) {                /*  RAM    */
  72.         devno = DEV_RAM ;
  73.     } else if ( *drive_type == DRV_ROM ) {                /*  ROM    */
  74.         devno = DEV_ROM ;
  75.     } else {                                            /*  ???    */
  76.         devno = FALSE ;
  77.     }
  78.  
  79.     return( devno ) ;
  80. }
  81.  
  82. /********************  ドライブステータス情報の取り出し  *********************/
  83. uchar DRV_status( uchar drvno )
  84. /*=============================================================================
  85. **    < INPUT  > : drvno [BYTE] - ドライブ番号 ( 0 ~ 15 )
  86. **    < OUTPUT > : なし
  87. **    < RETURN > : ドライブ情報... = 0FFH ならば エラー( ドライブ指定ミス )
  88. **                                            → ドライブが未登録又は使用不可
  89. **
  90. **    _7_6_5_4_3_2_1_0_
  91. **    | | | | | | | | |
  92. **    ~~~~~~~~~~~~~~~~~
  93. **    |-------| : ドライブ種別
  94. **                FD  = 0H
  95. **                HD  = 2H
  96. **                RAM = 3H
  97. **                ROM = 5H
  98. **
  99. **            |-------| : ドライブ状態
  100. **                   * ...Drive Ready ?    =0 <ready>  =1 <NOTready>
  101. **                 * .....Write Protect ?  =0 <OFF>    =1 <ON>
  102. **               * .......Single Drive ?   =0 <NO>     =1 <YES>
  103. **             * .........記録密度         =0 倍密度   =1 単密度
  104. =============================================================================*/
  105. {
  106.     union    REGS    regs ;
  107.     uchar    devno, drive_type, drive_no, retinf, single ;
  108.  
  109.     if ( drvno > 15 ) {
  110. /*        printf("Drive No.(%d) ERROR\n",drvno) ;        */
  111.         return( 0xff ) ;
  112.     }
  113.  
  114.     if ( drvno == 1 ) {
  115.         single = DRV_single() ;
  116.     } else {
  117.         single = FALSE ;
  118.     }
  119.  
  120.     devno  = DRV_devno( drvno,&drive_type,&drive_no ) ;
  121.  
  122.     switch ( drive_type ) {
  123.     case DRV_RAM :
  124.         retinf = DRV_RAM ;
  125.         retinf <<= 4 ;
  126.         return( retinf ) ;
  127.     case DRV_ROM :
  128.         retinf = DRV_ROM ;
  129.         retinf <<= 4 ;
  130.         retinf |= 0x02 ;
  131.         return( retinf ) ;
  132.     case DRV_FD :
  133.     case DRV_HD :
  134.         break ;
  135.     default :
  136.         return( DEV_ERR ) ;
  137.     }
  138.     
  139.     regs.h.ah = 0x02 ;
  140.     regs.h.al = devno ;
  141.     regs.h.ch = 0 ;
  142.  
  143.     int86(0x93,®s,®s) ;
  144.  
  145.     retinf = DRV_FD ;
  146.     if ( drive_type == DRV_FD ) {            /*  FD    */
  147.         if ( (regs.h.dl & 0x80) == 0x80 )    /*  単密度?    */
  148.             retinf |= 0x08 ;
  149.         if ( (regs.h.dl & 0x02) == 0x02 )    /*  書き込み保護?    */
  150.             retinf |= 0x02 ;
  151.         if ( (regs.h.dl & 0x01) == 0x01 )    /*  NOT READY ?    */
  152.             retinf |= 0x01 ;
  153.         if ( single && drvno == 1 )            /*  SINGLE DRIVE MODE ?    */
  154.             retinf |= 0x05 ;
  155.         if ( regs.h.ah )                    /*  エラー    */
  156.             retinf |= 0x01 ;
  157.     } else if ( drive_type == DRV_HD ) {    /*  HD    */
  158.         retinf |= (DRV_HD << 4) ;
  159.         if ( regs.h.ah )                    /*  エラー    */
  160.             retinf |= 0x01 ;
  161.     } else if ( regs.h.ah ) {                /*  エラー    */
  162.         retinf = 0xff ;
  163.     } else {
  164.         retinf |= 0xf1 ;                    /*  ?????    */
  165.     }
  166.     return( retinf ) ;
  167. }
  168.  
  169.